package org.zxp.gc.reference;

import org.junit.Test;

import java.lang.ref.SoftReference;
import java.util.ArrayList;

/**
 * @program: effectiveJava
 * @description: 测试SoftReference
 * @author: X-Pacific zhang
 * @create: 2019-05-20 10:58
 **/
public class TestSoftReference {
    public static void main(String[] args){
//        这种是不行的，因为apple1的引用还在
//        Apple apple1 = new Apple("1",new byte[1024*1024*10])
//        SoftReference softReference = new SoftReference(apple1);
//        这种是可以回收的，当内存不足时就会回收了
        /**
         * apple对象分配了40M多的空间
         */
        SoftReference softReference = new SoftReference(new Apple("1",new byte[1024*1024*40]));
        System.out.println(softReference.get());
        ArrayList list = new ArrayList();
        int index = 0;
        //持续给堆内存分配1k空间
        while(true){
            System.out.println(++index);
            byte[] bytes = new byte[1024*1];
            list.add(bytes);

            if(softReference.get()==null){
                //18441次 约为18M时触发了GC并回收了apple的软引用，说明了软引用的回收策略
                System.out.println("已经回收，不再循环");
                break;
            }
        }
        //单独执行下面这段是不会回收的，还没到回收触发的条件
//        SoftReference softReference2 = new SoftReference(new Apple("2"));
//        System.gc();
//        System.out.println(softReference2.get());
    }

    @Test
    public void testMname(){
        SoftReference softReference2 = new SoftReference(new Apple("2"));
        System.gc();
        System.out.println(softReference2.get());
    }
}
